#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' main entry '
__author__ = 'pingwu you'


def consumer():
    r = 'first-first' #自己初始化的部分，一般对于sender无意义
    while True:
        #yield 后面是传进来的出参，用于给调用者传递信息
        # n是调用者send给予的信息
        #  通过yield拿到消息n，又通过yield把结果传回r给提供者
        n = yield r
        if not n:
            return
        print('[CONSUMER] Consuming %s...' % n)
        #在下次yield之前，返回给调用者的信息
        r = '200 OK-----'+str(n)

def produce(c):
    #启动gen生成器，首次不用传递什么信息，启动初始化一下消费者端
    #can't send non-None value to a just-started generator
    rrrr=c.send(None)
    print('[PRODUCER] 首次send后得到的返回信息 %s...' % rrrr)
    n = 0
    while n < 5:
        n = n + 1
        print('[PRODUCER] Producing %s...' % n)
        #供应给消费者一个产品
        r = c.send(n) #协调运行 消费侧会主动yield让渡
        #而且在一套确定的流程体系内，没有必要加锁了
        print('[PRODUCER] Consumer return: %s' % r)
    c.close()

#启动一次基于协程的生产消费过程
def start_coruntine():
    c = consumer()
    produce(c)


def gen_demo():
    outer="first"
    print("------------"+outer)
    input=yield outer
    print("----11111-----"+str(input))
    input=yield "second"
    print("----22222-----"+str(input))
    return "end"

def handle_gen():
    g=gen_demo()
    #首次执行到第一个yield处
    print(next(g))
    #执行到第二个yield处
    print(next(g))
    try:
        #执行到return 处 触发异常
        print(next(g))
    except BaseException as e:
        print("exception--->  "+str(e))
